package br.com.peri.conceito.modelo.impl;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import br.com.peri.Usuario;
import br.com.peri.conceito.exception.ConceitoException;
import br.com.peri.conceito.modelo.UsuarioApp;
import br.com.peri.enums.StatusPeriResponse;
import br.com.peri.rs.UsuarioResource;
import br.com.peri.rs.UsuarioResource;
import br.com.peri.vo.PeriResponse;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

@Name(value = "usuarioAppRest")
@Stateless
public class UsuarioAppRestBean implements UsuarioApp {

	private static final long serialVersionUID = 1L;

	@In(create = true)
	private UsuarioResource usuarioResource;

	public Usuario salvar(Usuario usuario) throws ConceitoException {
		Gson gson = new Gson();
		String jsonResponse = usuarioResource.salvarUsuario(gson.toJson(usuario));
		Type type = new TypeToken<PeriResponse<Usuario>>() {
		}.getType();
		PeriResponse<Usuario> PeriResponse = gson.fromJson(jsonResponse,
				type);
		if (StatusPeriResponse.ERRO.equals(PeriResponse.getStatus())) {
			throw new ConceitoException(PeriResponse.getMensagens());
		}
		return PeriResponse.getObjeto();
	}

	public Usuario atualizar(Usuario usuario) throws ConceitoException {
		Gson gson = new Gson();
		String jsonResponse = usuarioResource.atualizarUsuario(gson
				.toJson(usuario));
		Type type = new TypeToken<PeriResponse<Usuario>>() {
		}.getType();
		PeriResponse<Usuario> PeriResponse = gson.fromJson(jsonResponse,
				type);
		if (StatusPeriResponse.ERRO.equals(PeriResponse.getStatus())) {
			throw new ConceitoException(PeriResponse.getMensagens());
		}
		return PeriResponse.getObjeto();
	}

	public void excluir(Usuario usuario) throws ConceitoException {
		if (usuario == null) {
			return;
		}
		Gson gson = new Gson();
		String jsonResponse = usuarioResource.excluirUsuario(usuario.getId());
		Type type = new TypeToken<PeriResponse<Usuario>>() {
		}.getType();
		PeriResponse<Usuario> PeriResponse = gson.fromJson(jsonResponse,
				type);
		if (StatusPeriResponse.ERRO.equals(PeriResponse.getStatus())) {
			throw new ConceitoException(PeriResponse.getMensagens());
		}
	}

	public Usuario pesquisarPorId(Usuario usuario) {
		if (usuario == null) {
			return null;
		}
		String jsonResponse = usuarioResource.getUsuarioPorId(usuario.getId());
		return new Gson().fromJson(jsonResponse, Usuario.class);
	}

	public List<Usuario> listarTodosUsuarios() {
		
		String jsonResponse = usuarioResource.listarTodosUsuarios();
		Type type = new TypeToken<List<Usuario>>() {
		}.getType();
		return new Gson().fromJson(jsonResponse, type);
	}

}